package cn.ecut.dzy.cf;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * @program: juc
 * @description: 未来任务
 * 比如主线程让一个子线程去执行任务，子线程可能比较耗时，启动子线程开始执行任务后，
 * 主线程就去做其他事情了，过了一会才去获取子任务的执行结果。
 * @author: DingZhenYun
 * @create: 2021-10-19 19:03
 **/

public class FutureTaskDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask<Integer> futureTask = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + "\t" + "---come in");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 1200;
        });
        new Thread(futureTask,"t1").start();
        System.out.println(Thread.currentThread().getName()+"主线程继续干活");

        //System.out.println(futureTask.get());
        // 不见不散，只要出现get方法，不管是否计算完成都阻塞等待结果出来再运行--放在最后


        //System.out.println(futureTask.get(2L,TimeUnit.SECONDS));//过时不候

        //不要阻塞，尽量用轮询替代
        while(true)
        {
            if(futureTask.isDone())
            {
                System.out.println("----result: "+futureTask.get());
                break;
            }else{
                System.out.println("还在计算中，别催，越催越慢，再催熄火");
            }
        }

    }
}
